/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p44;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IAdresse;
import fr.generali.accueilclient.client.om.IEmail;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.ISiteInternet;
import fr.generali.accueilclient.client.om.ITelephone;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoAdressePostale;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoCourriel;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoPageWeb;
import fr.generali.refservcommuns.rce.demat.servperscom.ctc.gestioncontacts.DtoTelephone;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.profilmarketingpersonnes.DtoInformationMarketingImmobilier;
import fr.generali.refservcommuns.rce.demat.servperscom.pty.profilmarketingpersonnes.DtoProfilMarketing;

/**
 * Permet de mapper adresse, téléphone et email
 * 
 * @author Guillaume Lancelin
 */
@Component
public class DonneesContactP44Mapper {

    /**
     * Assembler adresse postale
     */
    @Autowired
    @Qualifier("dtoAdressePostale2AdresseP44Converter")
    private Converter<DtoAdressePostale, IAdresse> dtoAdressePostale2AdresseConverter;

    /**
     * Assembler adresse mail
     */
    @Autowired
    @Qualifier("dtoCourriel2EmailP44Converter")
    private Converter<DtoCourriel, IEmail> dtoCourriel2EmailConverter;

    /**
     * Assembler Téléphone
     */
    @Autowired
    @Qualifier("dtoTelephone2TelephoneP44Converter")
    private Converter<DtoTelephone, ITelephone> dtoTelephone2TelephoneConverter;

    /**
     * Assembler Site Internet
     */
    @Autowired
    @Qualifier("dtoPageWeb2SiteInternetP44Converter")
    private Converter<DtoPageWeb, ISiteInternet> dtoPageWeb2SiteInternetConverter;

    /**
     * @param adresses une liste de {@link DtoAdressePostale}
     * @param profilMarketing le profile marketing de la personne
     * @return l'adresse principale du client
     */
    public IAdresse getAdressePrincipale(List<DtoAdressePostale> adresses, DtoProfilMarketing profilMarketing) {
        IAdresse adresse = null;
        if (CollectionUtils.isNotEmpty(adresses)) {
            adresse = dtoAdressePostale2AdresseConverter.convert(adresses.get(0));
            if (adresse != null) {
                adresse.setPrincipal(true);
            }
        }
        return adresse;
    }

    /**
     * @param adresse l'adresse du client
     * @return l'adresse principale du client
     */
    public IAdresse getAdressePrincipale(DtoAdressePostale adresse) {
        return dtoAdressePostale2AdresseConverter.convert(adresse);
    }

    /**
     * @param courriels une liste de {@link DtoCourriel}
     * @return l'email du client
     */
    public IEmail getEmail(List<DtoCourriel> courriels) {
        IEmail email = null;
        if (courriels != null && !courriels.isEmpty()) {
            email = dtoCourriel2EmailConverter.convert(courriels.get(0));
            email.setPrincipal(true);
        }

        return email;
    }

    /**
     * @param emails {@link DtoCourriel}
     * @param liste liste d'Emails
     * @param isPrincipale top principal
     * @return une liste de {@link IEmail}
     */
    public List<IEmail> getListeEmail(List<DtoCourriel> emails, List<IEmail> liste, boolean isPrincipale) {
        if (CollectionUtils.isNotEmpty(emails)) {
            for (Iterator<DtoCourriel> it = emails.iterator(); it.hasNext();) {
                IEmail mail = dtoCourriel2EmailConverter.convert(it.next());
                if (mail != null) {
                    if (liste.contains(mail)) {
                        if (isPrincipale) {
                            liste.get(liste.indexOf(mail)).setPrincipal(isPrincipale);
                        }
                    } else {
                        mail.setPrincipal(isPrincipale);
                        liste.add(mail);
                    }
                }
            }
        }

        return liste;
    }

    /**
     * @param telephones {@link DtoTelephone}
     * @param liste liste de telephones
     * @param isPrincipale top principal
     * @return une liste de {@link ITelephone}
     */
    public List<ITelephone> getListeTelephone(List<DtoTelephone> telephones, List<ITelephone> liste,
                    boolean isPrincipale) {
        if (CollectionUtils.isNotEmpty(telephones)) {
            for (Iterator<DtoTelephone> it = telephones.iterator(); it.hasNext();) {
                ITelephone telephone = dtoTelephone2TelephoneConverter.convert(it.next());
                if (telephone != null) {
                    if (liste.contains(telephone)) {
                        if (isPrincipale) {
                            liste.get(liste.indexOf(telephone)).setPrincipal(isPrincipale);
                        }
                    } else {
                        telephone.setPrincipal(isPrincipale);
                        liste.add(telephone);
                    }
                }
            }
        }

        return liste;
    }

    /**
     * @param siteInternets {@link DtoSiteInternet}
     * @param liste liste de siteInternets
     * @param isPrincipale top principal
     * @return une liste de {@link ISiteInternet}
     */
    public List<ISiteInternet> getListeSiteInternet(List<DtoPageWeb> siteInternets, List<ISiteInternet> liste,
                    boolean isPrincipale) {
        if (CollectionUtils.isNotEmpty(siteInternets)) {
            for (Iterator<DtoPageWeb> it = siteInternets.iterator(); it.hasNext();) {
                ISiteInternet siteInternet = dtoPageWeb2SiteInternetConverter.convert(it.next());
                if (siteInternet != null) {
                    if (liste.contains(siteInternet)) {
                        if (isPrincipale) {
                            liste.get(liste.indexOf(siteInternet)).setPrincipal(isPrincipale);
                        }
                    } else {
                        siteInternet.setPrincipal(isPrincipale);
                        liste.add(siteInternet);
                    }
                }
            }
        }

        return liste;
    }

    /**
     * @param adresses .
     * @param liste .
     * @param profilMarketing le profile marketing de la personne
     * @return .
     */
    public List<IAdresse> getListeAdressePrincipale(List<DtoAdressePostale> adresses, List<IAdresse> liste,
                    DtoProfilMarketing profilMarketing) {
        return getListeAdresse(adresses, liste, true, false, false, profilMarketing);
    }

    /**
     * @param adresses .
     * @param liste .
     * @param profilMarketing le profile marketing de la personne
     * @return .
     */
    public List<IAdresse> getListeAdresseCourrier(List<DtoAdressePostale> adresses, List<IAdresse> liste,
                    DtoProfilMarketing profilMarketing) {
        return getListeAdresse(adresses, liste, false, false, true, profilMarketing);
    }

    /**
     * @param adresses .
     * @param liste .
     * @param profilMarketing le profile marketing de la personne
     * @return .
     */
    public List<IAdresse> getListeAdresseFiscale(List<DtoAdressePostale> adresses, List<IAdresse> liste,
                    DtoProfilMarketing profilMarketing) {
        return getListeAdresse(adresses, liste, false, true, false, profilMarketing);
    }

    /**
     * @param adresses .
     * @param liste .
     * @param profilMarketing le profile marketing de la personne
     * @return .
     */
    public List<IAdresse> getListeAdresseSecondaire(List<DtoAdressePostale> adresses, List<IAdresse> liste,
                    DtoProfilMarketing profilMarketing) {
        return getListeAdresse(adresses, liste, false, false, false, profilMarketing);
    }

    /**
     * @param adresses .
     * @param liste .
     * @param isPrincipale true/false si l'adresse est l'adresse principal
     * @param isFiscale true/false si l'adresse est une adresse fiscale
     * @param isCourrier true/false si l'adresse est une adresse courrier
     * @param profilMarketing le profile marketing de la personne
     * @return .
     */
    private List<IAdresse> getListeAdresse(List<DtoAdressePostale> adresses, List<IAdresse> liste,
                    boolean isPrincipale, boolean isFiscale, boolean isCourrier, DtoProfilMarketing profilMarketing) {
        if (CollectionUtils.isNotEmpty(adresses)) {
            for (Iterator<DtoAdressePostale> it = adresses.iterator(); it.hasNext();) {
                IAdresse adresse = dtoAdressePostale2AdresseConverter.convert(it.next());
                if (adresse != null) {
                    if (liste.contains(adresse)) {
                        if (isCourrier) {
                            liste.get(liste.indexOf(adresse)).setCourrier(isCourrier);
                        }
                        if (isPrincipale) {
                            liste.get(liste.indexOf(adresse)).setPrincipal(isPrincipale);
                        }
                        if (isFiscale) {
                            liste.get(liste.indexOf(adresse)).setFiscal(isFiscale);
                        }
                    } else {
                        adresse.setCourrier(isCourrier);
                        adresse.setPrincipal(isPrincipale);
                        adresse.setFiscal(isFiscale);
                        liste.add(adresse);
                    }

                    completeInfosMarketing(adresse, profilMarketing);

                }
            }
        }
        return liste;
    }

    /**
     * @param adresse l'adresse à renseigner
     * @param profilMarketing le profile marketing de la personne
     * @return l'adresse enrichie de ses infos marketing
     */
    private IAdresse completeInfosMarketing(IAdresse adresse, DtoProfilMarketing profilMarketing) {
        if (profilMarketing != null && CollectionUtils.isNotEmpty(profilMarketing.getInfoImmobilier())) {
            for (Iterator<DtoInformationMarketingImmobilier> itMarketing =
                            profilMarketing.getInfoImmobilier().iterator(); itMarketing.hasNext();) {
                DtoInformationMarketingImmobilier infoMarketingImmobilier = itMarketing.next();
                if (infoMarketingImmobilier != null) {
                    if (infoMarketingImmobilier.getBiensImmobiliersPossedes() != null
                                    && infoMarketingImmobilier.getBiensImmobiliersPossedes().getIdentifiantAdresse()
                                                    .equals(adresse.getIdentifiant())) {
                        if (infoMarketingImmobilier.getBiensImmobiliersPossedes().getSurfaceHabitable() != null
                                        && infoMarketingImmobilier.getBiensImmobiliersPossedes().getSurfaceHabitable()
                                                        .getValue() != null) {
                            adresse.setSurface(infoMarketingImmobilier.getBiensImmobiliersPossedes()
                                            .getSurfaceHabitable().getValue().toString());
                        }

                        if (infoMarketingImmobilier.getBiensImmobiliersPossedes().getNombrePiecesPrincipales() != null) {
                            adresse.setNbPieces(infoMarketingImmobilier.getBiensImmobiliersPossedes()
                                            .getNombrePiecesPrincipales().toString());
                        }
                    }

                    if (infoMarketingImmobilier.getModeExploitationFondCommerce() != null
                                    && StringUtils.isNotEmpty(infoMarketingImmobilier.getModeExploitationFondCommerce()
                                                    .getCode())
                                    && infoMarketingImmobilier.getModeExploitationFondCommerce()
                                                    .getIdentifiantAdresse().equals(adresse.getIdentifiant())) {
                        adresse.setFondCommerce(infoMarketingImmobilier.getModeExploitationFondCommerce().getCode()
                                        .toString());
                    }
                }
            }
        }
        return adresse;
    }

    /**
     * @param personne le client courant
     * @param profilMarketing le profile marketing de la personne
     * @return l'adresse enrichie de ses infos marketing
     */
    public String checkEspaceClient(IPersonne personne, DtoProfilMarketing profilMarketing) {
        String login = null;

        if (profilMarketing != null && profilMarketing.getInformationEspaceClient() != null
                        && StringUtils.isNotEmpty(profilMarketing.getInformationEspaceClient().getLoginEspaceClient())) {
            login = profilMarketing.getInformationEspaceClient().getLoginEspaceClient();
        }

        return login;
    }
}
